package com.example.exception;

import com.example.common.ApiResult;
import org.apache.tomcat.util.http.fileupload.impl.SizeLimitExceededException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.multipart.MaxUploadSizeExceededException;

@RestControllerAdvice
public class GlobalHandlerException {

    /**
     * @ExceptionHandler注解我们一般是用来自定义异常的。
     * 可以认为它是一个异常拦截器（处理器）
     */

    /**
     * 自定义业务异常校验
     * @param ex
     * @return
     */
    @ExceptionHandler(value = {BusinessException.class})//自定义异常
    public ApiResult handleBusinessException(BusinessException ex){
        ex.printStackTrace();
        return ApiResult.fail(400,ex.getMessage());
    }


    /**
     * 请求参数缺少异常校验
     * @param ex
     * @return
     */
    @ExceptionHandler(value = {MissingServletRequestParameterException.class})//请求参数缺失
    public ApiResult<String> handleMissingServletRequestParameterException(MissingServletRequestParameterException ex) {
        ex.printStackTrace();
        return ApiResult.fail(400, String.format("缺少必要参数[%s]", ex.getParameterName()));
    }

    /**
     * 请求参数验证异常校验
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)//方法校验异常————范围，非空，正则异常
    public ApiResult handleValidationException(MethodArgumentNotValidException e) {
        e.printStackTrace();
        return ApiResult.fail(400,e.getBindingResult().getFieldError().getDefaultMessage());
    }


    /**
     *处理文件上传和系统异常校验
     */
    @ExceptionHandler(value = {Exception.class})//兜底  Exception异常
    public ApiResult handleSystemException(Exception ex){
        ex.printStackTrace();
        if(ex instanceof MaxUploadSizeExceededException) {
            MaxUploadSizeExceededException err = (MaxUploadSizeExceededException)ex;
            String msg =  "上传文件超过了最大文件大小,最大文件大小为500MB";
            return ApiResult.fail(500,msg);
        }
        if(ex instanceof SizeLimitExceededException){
            SizeLimitExceededException err = (SizeLimitExceededException)ex;
            String msg =  "上传文件超过单文件大小,单文件允许大小为100MB";
            return ApiResult.fail(500,msg);
        }
        return ApiResult.fail(500,"系统繁忙，请稍后重试！");
    }
}
